home *** CD-ROM | disk | FTP | other *** search
-
- # Definition of the run-time routines for emerald types.
- # Origin: Norm Hutchinson, 1986-05-15.
- #
- # /* C O P Y R I G H T N O T I C E : */
- # /* Copyright 1986 Eric Jul and Norm Hutchinson. May not be used for any */
- # /* purpose without written permission from the authors. */
-
- # This defines a number of simple code pieces called by compiled code.
-
- LL0:
-
- include(../h/vax.regdefs.h)
- include(../h/consts.h)
-
- define(ementry,_$1: .globl _$1)
- define(emexit,rsb)
-
- define(dosaveregs,
- moval SS_regs`('regs_ssp`)'`,'scratch
- movq r3`,'(scratch)+
- movq r5`,'(scratch)+
- movq r7`,'(scratch)+
- movl r9`,'(scratch)+
- movq r11`,'(scratch)+
- movq r13`,'(scratch)
- movl _kernelsp`,'sp
- )
-
- define(c_restoreregs,
- movl _currentSSP`,'regs_ssp
- moval SS_regs `(' regs_ssp `)' `,' scratch
- movq (scratch)+`,'r3
- movq (scratch)+`,'r5
- movq (scratch)+`,'r7
- movl (scratch)+`,'r9
- movq (scratch)+`,'r11
- movq (scratch)`,'r13
- rsb
- )
-
- # For calling C procedures
- define(call_c,
- `dosaveregs'
- `ifelse($1,3,
- pushl arg3
- pushl arg2
- pushl arg1)
- ifelse($1,2,
- pushl arg2
- pushl arg1)
- ifelse($1,1,
- pushl arg1)'
- calls `$'$1`,'_$2
- `ifelse($3,1,
- movl r0`,'arg1)'
- `c_restoreregs'
- )
-
-
- ########################################################################
- # string_getElement is inlined
-
- ########################################################################
- # string_getSlice
- # entry:
- # arg1 == string pointer
- # arg2 == index of the first element
- # arg3 == length
- # exit:
- # arg1 == the result string pointer
-
- ementry(ems_getSlice)
- tstl r3
- beql 8f
- blss 9f
- cmpl r2,String_sizeInBytes (r1)
- bgequ 9f
- addl3 r2, r3, r0 # r0 is upperbound + 1
- cmpl r0,String_sizeInBytes (r1)
- bgtru 9f
- movq r4,-(sp)
- movab String_data (r1)[r2], r2
- movl r3, r1
- jsb *$ _em_createString
- pushl r1
- movc3 r3, (r2), String_data (r1)
- movl (sp)+, r1
- movq (sp)+, r4
- emexit
- 8: #zero length
- clrl r1
- jsb *$ _em_createString
- emexit
- 9: #range check
- jmp *$ _em_assertionFailure
-
- ########################################################################
- # string_compare is inlined
- # This is here to make ementryset and ementryext the same.
-
- ementry(ems_compare)
- halt
- emexit
-
- ########################################################################
- # string_catenate
- # entry:
- # arg1 == left string pointer
- # arg2 == right string pointer
- # exit:
- # arg1 == new string pointer
-
- ementry(ems_catenate)
- pushl r6
- movq r4, -(sp)
- pushl r2
- pushl r1
- addl3 String_sizeInBytes (r1), String_sizeInBytes (r2), r1
- jsb *$ _em_createString
- movl r1, r6
-
- movl (sp)+, r2
- movc3 String_sizeInBytes (r2), String_data (r2), String_data (r1)
-
- movl (sp)+, r2
- movc3 String_sizeInBytes (r2), String_data (r2), (r3)
-
- movl r6, r1
- movq (sp)+, r4
- movl (sp)+, r6
- emexit
-
- # Definition of the run-time routines for times.
-
- define(sec,ROData_inlineData)
- define(usec,ROData_inlineData+4)
-
- ########################################################################
- #
- # Times are signed quantities. They are represented by a signed integer
- # number of seconds (s), and an unsigned integer number of microseconds
- # (u), where 0 <= u < 1000000. All these arithmetic operations maintain
- # this invariant.
-
- ########################################################################
- # emtime_plus
- # entry:
- # arg1 == self
- # arg2 == the other time value
- # exit:
- # arg1 == the new result
-
- ementry(emtime_plus)
- movq arg1, -(sp)
- movl LOData_myCodePtr (arg1),arg1
- jsb *$ _em_localQuickCreate
- movq (sp)+, arg2
- addl3 sec (arg3),sec (arg2),sec (arg1)
- addl3 usec (arg3),usec (arg2),usec (arg1)
- cmpl usec (arg1),$1000000
- blss 1f
- subl2 $1000000,usec (arg1)
- incl sec (arg1)
- 1:
- emexit
-
- ########################################################################
- # emtime_minus
- # entry:
- # arg1 == self time pointer
- # arg2 == the other time pointer
- # exit:
- # arg1 == the result time pointer
-
- ementry(emtime_minus)
- movq arg1, -(sp)
- movl LOData_myCodePtr (arg1),arg1
- jsb *$_em_localQuickCreate
- movq (sp)+, arg2
- subl3 sec (arg3),sec (arg2),sec (arg1)
- subl3 usec (arg3),usec (arg2),usec (arg1)
- tstl usec (arg1)
- bgeq 1f
- addl2 $1000000,usec (arg1)
- decl sec (arg1)
- 1:
- emexit
-
- ########################################################################
- # emtime_times
- # entry:
- # arg1 == self time pointer
- # arg2 == the integer multiplicand
- # exit:
- # arg1 == the result time pointer
-
- ementry(emtime_times)
- movl arg2, -(sp)
- movl arg1, -(sp)
- movl LOData_myCodePtr (arg1),arg1
- jsb *$_em_localQuickCreate
- movl (sp)+, scratch # scratch is the pointer to
- # the multiplicand. (sp) is
- # the multiplier
- mull3 (sp), sec (scratch), sec (arg1)
- emul (sp)+, usec (scratch), $0, r2
- ediv $1000000, r2, r2, usec (arg1)
- addl2 r2, sec (arg1)
- 1:
- emexit
-
- ########################################################################
- # emtime_divide
- # entry:
- # arg1 == self time pointer
- # arg2 == the integer divisor
- # exit:
- # arg1 == the result time pointer
-
- ementry(emtime_divide)
- movl arg2, -(sp)
- movl arg1, -(sp)
- movl LOData_myCodePtr (arg1),arg1
- jsb *$_em_localQuickCreate
- movl (sp)+, scratch # scratch is the pointer to
- # the dividend, (sp) is the
- # divisor
- clrl arg3
- movl sec (scratch), arg2
- ediv (sp), arg2, sec (arg1), arg2
- emul $1000000, arg2, usec (scratch), arg2
- ediv (sp)+, arg2, usec (arg1), arg2
- bgeq 1f
- addl2 $1000000,usec (arg1)
- decl sec (arg1)
- 1:
- emexit
-
- ########################################################################
- # emtime_compare
- # entry:
- # arg1 == left time pointer
- # arg2 == right time pointer
- # exit:
- # condition codes set right
-
- ementry(emtime_compare)
- cmpl sec (arg1), sec (arg2)
- bneq 1f
- tstl sec (arg1)
- blss 2f
- cmpl usec (arg1), usec (arg2)
- jbr 1f
- 2: cmpl usec (arg2), usec (arg1)
- 1:
- emexit
-
-
- # Definition of the run-time routines for vectors.
-
- ########################################################################
- # vector_get[148]Slice
- # entry:
- # arg1 == vector pointer
- # arg2 == index of the first element
- # arg3 == length
- # exit:
- # arg1 == the result vector pointer
-
- ementry(emvector_get1Slice)
- jmp *$ _em_assertionFailure
- emexit
-
- ementry(emvector_get4Slice)
- jmp *$ _em_assertionFailure
- emexit
-
- ementry(emvector_get8Slice)
- jmp *$ _em_assertionFailure
- emexit
-
- ########################################################################
- # vector_set[148]Slice
- # entry:
- # scratch == other vector pointer
- # arg1 == vector to change pointer
- # arg2 == index of the first element
- # arg3 == length
- # exit:
-
- ementry(emvector_set1Slice)
- jmp *$ _em_assertionFailure
- emexit
-
- ementry(emvector_set4Slice)
- jmp *$ _em_assertionFailure
- emexit
-
- ementry(emvector_set8Slice)
- jmp *$ _em_assertionFailure
- emexit
-
-
- ########################################################################
- # vector_catenate[148]
- # entry:
- # arg1 == left vector pointer
- # arg2 == right vector pointer
- # exit:
- # arg1 == new vector pointer
-
- ementry(emvector_catenate1)
- jmp *$ _em_assertionFailure
- emexit
-
- ementry(emvector_catenate4)
- jmp *$ _em_assertionFailure
- emexit
-
- ementry(emvector_catenate8)
- jmp *$ _em_assertionFailure
- emexit
-
- ementry(eminteger_asString)
- .data
- .align 2
- 1: .ascii "%d\0"
- .text
- movl arg1, arg2
- movab 1b, arg1
- call_c(2,BuildString,1)
- movl r0,r1
- emexit
-
- ementry(emboolean_asString)
- .data
- .align 2
- 1: .ascii "true\0"
- .align 2
- 2: .ascii "false\0"
- .text
- tstl arg1
- jeql 3f
- movab 1b, arg1
- jbr 4f
- 3: movab 2b, arg1
- 4: clrl arg2
- call_c(2,BuildString,1)
- emexit
-
- ementry(emcharacter_asString)
- .data
- .align 2
- 1: .ascii "%c\0"
- .text
- movl arg1, arg2
- movab 1b, arg1
- call_c(2,BuildString,1)
- emexit
-
- ementry(emreal_asString)
- call_c(1,BuildRealString,1)
- emexit
-
- ementry(emtime_asString)
- call_c(1,BuildTimeString,1)
- emexit
-
- ementry(emtime_asDate)
- call_c(1,BuildTimeDate,1)
- emexit
-